iT邦幫忙

2021 iThome 鐵人賽

DAY 17
1

Preface

由於之後我們會解說到像是Gin搭配RDBMS或是Gin搭配Cache....等,因此在這章節我們將會寫好我們gin example所要用到的Dockerfile以及搭配的docker-compose。

Dockerfile

FROM golang:latest

RUN mkdir -p /usr/local/go/src/ironman-2021
WORKDIR /usr/local/go/src/ironman-2021
ADD . /usr/local/go/src/ironman-2021

RUN go mod download
RUN go build ./main.go

EXPOSE 8080
CMD ["./main"]
  • 首先,創建一個directory在預設的$GOPATH之下
  • 接下來則是執行go mod download,下載所有用到的第三方套件
  • 最後則是執行main.go 主程式檔
  • 然後對外暴露8080 port

對docker不熟者可以去參考我去年的鐵人賽文章,連結在此

https://ithelp.ithome.com.tw/users/20129737/ironman/3501

前半部分都是圍繞著docker以及docker-compose解說

docker-compose

version: '3.5'
services:
  postgresql:
    container_name: postgresql
    image: postgres:12.7
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
      timeout: 45s
      interval: 10s
      retries: 10
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=password
      - APP_DB_USER=ironman
      - APP_DB_PASS=password
      - APP_DB_NAME=gorm
    volumes:
    - ./db:/docker-entrypoint-initdb.d/
    networks:
      - backend-bridge
    restart: always
  redis:
    container_name: redis
    image: redis:latest
    ports:
    - "6379:6379"
    networks:
      - backend-bridge
    restart: always
  ironman-2021:
    container_name: ironman-2021
    ports:
      - "8080:8080"
    build:
      context: ./
      dockerfile: Dockerfile
    command: ./main
    restart: always
    networks:
      - backend-bridge
    depends_on:
      - postgresql
      - redis

networks:
  backend-bridge:
    driver: bridge

volumes:
  data: {}
  • 第一個container為postgresql,比較特別的是我們有幫他寫個health check以及將data mount出來,但這並非必要,然後environment的部分,除了直接寫在compose內宣告環境變數外,也可使用吃env extension file的形式匯入,而這個container會在之後的gorm篇章使用到。
  • 第二個container則是redis,這裡就沒什麼特別的了,然後該container則是會在後面與cache有關的章節用到。
  • 最後則是gin主程式的container。

以上部分也是如有不懂可以參考我去年鐵人賽文章!

https://ithelp.ithome.com.tw/users/20129737/ironman/3501

前半部分都是圍繞著docker以及docker-compose解說

main.go

最後則是main.go部分,它與day-16 branch比起來多了匯入.env變數的部分!

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/joho/godotenv"
	"ironman-2021/app/config"
	"os"
)

func main() {
	envErr := godotenv.Load()
	if envErr != nil {
		panic(envErr)
	}

	port := os.Getenv("PORT")

	app := gin.Default()
	app.GET("/hc", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "health check",
		})
	})
	config.RouteUsers(app)
	err := app.Run(":" + port)
	if err != nil {
		panic(err)
	}
}
  • godotenv: 該套件能夠直接在專案的目錄底下偵測有無.env檔案的存在,沒有的話會出現 Error loading .env file 的錯誤,有的話則接下來就能讀取.env之中的變數資料。

Summary

這章節我們做了許許多多未來後端開發的事前準備,像是下個章節解說gorm時所要用到的postgresql,以及所需吃到環境變數的godotenv等,這也讓我們往後的開發事半功倍。

這章節的程式碼也會放在下方連結~

https://github.com/Neskem/Ironman-2021/tree/Day-17


上一篇
Day16 Gin's Routing Structure And Context
下一篇
Day18 Gin with GORM
系列文
fmt.Println("從零開始的Golang生活")30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言